import unittest
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import os
import sys

class AdminPageTest(unittest.TestCase):
    """管理员页面功能测试类"""
    
    @classmethod
    def setUpClass(cls):
        """在所有测试开始前执行一次"""
        chrome_options = Options()
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--disable-dev-shm-usage')
        chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])
        
        try:
            # 尝试启动Chrome浏览器
            cls.driver = webdriver.Chrome(options=chrome_options)
        except Exception as e:
            print(f"无法启动Chrome浏览器: {e}")
            try:
                # 尝试启动Edge浏览器作为备选
                cls.driver = webdriver.Edge()
                print("使用Edge浏览器进行测试")
            except:
                print("无法启动Edge浏览器，测试无法继续")
                sys.exit(1)
        
        # 设置窗口大小
        cls.driver.set_window_size(1200, 800)
        
        # 启动Flask应用
        # 这里假设已经在另一个终端启动了Flask应用
        
        # 设置等待时间
        cls.wait = WebDriverWait(cls.driver, 10)
        
        # 获取当前文件所在的目录
        current_dir = os.path.dirname(os.path.abspath(__file__))
        
        # 构建HTML文件的完整路径
        cls.html_path = os.path.join(current_dir, 'simple_admin.html')
        cls.html_url = f"file:///{cls.html_path}"
        
        # 打开HTML页面
        cls.driver.get(cls.html_url)
        time.sleep(2)  # 等待页面加载完成
    
    @classmethod
    def tearDownClass(cls):
        """在所有测试结束后执行一次"""
        cls.driver.quit()
    
    def setUp(self):
        """每个测试方法开始前执行"""
        # 每次测试前重新加载页面，确保测试环境一致
        self.driver.refresh()
        time.sleep(1)
    
    def test_01_page_title(self):
        """测试页面标题"""
        self.assertEqual("管理员信息管理", self.driver.title)
        
        # 验证页面主标题存在
        header = self.driver.find_element(By.TAG_NAME, 'h1')
        self.assertEqual("管理员信息管理", header.text)
        
        print("页面标题测试通过")
    
    def test_02_add_admin(self):
        """测试添加管理员功能"""
        # 填写表单
        self.driver.find_element(By.ID, 'account').send_keys('testuser')
        self.driver.find_element(By.ID, 'password').send_keys('123456')
        self.driver.find_element(By.ID, 'rid').send_keys('普通管理员')
        # createTime字段在页面加载时已经自动填写
        self.driver.find_element(By.ID, 'describe').send_keys('测试账号')
        
        # 提交表单
        self.driver.find_element(By.ID, 'submit-btn').click()
        
        # 等待添加操作完成
        time.sleep(2)
        
        # 检查表格中是否显示了添加的管理员
        tbody = self.driver.find_element(By.ID, 'admin-tbody')
        self.assertIn('testuser', tbody.text)
        self.assertIn('123456', tbody.text)
        self.assertIn('普通管理员', tbody.text)
        self.assertIn('测试账号', tbody.text)
        
        print("添加管理员测试通过")
    
    def test_03_edit_admin(self):
        """测试编辑管理员功能"""
        # 先等待表格加载完成
        time.sleep(1)
        
        # 点击第一个编辑按钮
        edit_buttons = self.driver.find_elements(By.XPATH, "//button[text()='编辑']")
        if len(edit_buttons) > 0:
            edit_buttons[0].click()
            time.sleep(1)
            
            # 修改描述字段
            describe_input = self.driver.find_element(By.ID, 'describe')
            describe_input.clear()
            describe_input.send_keys('已修改的描述')
            
            # 点击更新按钮
            self.driver.find_element(By.ID, 'submit-btn').click()
            
            # 等待更新操作完成
            time.sleep(2)
            
            # 验证更新是否成功
            tbody = self.driver.find_element(By.ID, 'admin-tbody')
            self.assertIn('已修改的描述', tbody.text)
            
            print("编辑管理员测试通过")
        else:
            self.skipTest("没有可编辑的管理员记录")
    
    def test_04_delete_admin(self):
        """测试删除管理员功能"""
        # 先等待表格加载完成
        time.sleep(1)
        
        # 获取删除前的管理员数量
        admin_rows_before = len(self.driver.find_elements(By.XPATH, "//tbody[@id='admin-tbody']/tr"))
        
        # 查找所有删除按钮
        delete_buttons = self.driver.find_elements(By.XPATH, "//button[text()='删除']")
        if len(delete_buttons) > 0:
            # 点击第一个删除按钮
            delete_buttons[0].click()
            
            # 处理确认弹窗
            alert = self.driver.switch_to.alert
            alert.accept()
            
            # 等待删除操作完成
            time.sleep(2)
            
            # 获取删除后的管理员数量
            admin_rows_after = len(self.driver.find_elements(By.XPATH, "//tbody[@id='admin-tbody']/tr"))
            
            # 验证删除是否成功
            self.assertEqual(admin_rows_before - 1, admin_rows_after)
            
            print("删除管理员测试通过")
        else:
            self.skipTest("没有可删除的管理员记录")
    
    def test_05_reset_form(self):
        """测试重置表单功能"""
        # 填写表单
        self.driver.find_element(By.ID, 'account').send_keys('testreset')
        self.driver.find_element(By.ID, 'password').send_keys('password123')
        
        # 点击重置按钮
        self.driver.find_element(By.ID, 'reset-btn').click()
        
        # 验证表单是否重置
        account_value = self.driver.find_element(By.ID, 'account').get_attribute('value')
        password_value = self.driver.find_element(By.ID, 'password').get_attribute('value')
        
        self.assertEqual('', account_value)
        self.assertEqual('', password_value)
        
        print("重置表单测试通过")

if __name__ == '__main__':
    unittest.main() 